package algo3.algothief.modelo;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class BaseDeDatosDeLadrones {

	private ArrayList<DescripcionDeLadron> descripciones;
	
//-------------------------------------------------------------------------------------
	
	public BaseDeDatosDeLadrones(String direccionDeLasDescripciones) throws ParserConfigurationException, SAXException, IOException {
		Document doc = this.cargarDocumentoNormalizado(direccionDeLasDescripciones);
		
		this.cargarBaseDeDatos(doc);
	}

//-------------------------------------------------------------------------------------
	
	private Document cargarDocumentoNormalizado(String direccionDelArchivo) throws ParserConfigurationException, SAXException, IOException {
		File archivo = new File(direccionDelArchivo);

		// Se traduce el archivo a algo manejable para el programa.
		DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
		Document doc = dBuilder.parse(archivo);
		doc.getDocumentElement().normalize();
		
		return doc;
	}
	
	private void cargarBaseDeDatos(Document doc) throws ParserConfigurationException, SAXException, IOException{
		Element elementoBaseDeDatos = (Element)doc.getElementsByTagName("BaseDeDatosDeLadrones").item(0);
		
		NodeList elementosDescripciones = elementoBaseDeDatos.getElementsByTagName("DescripcionDeLadron");
		int cantidadDeDescripciones = elementosDescripciones.getLength();
		
		this.descripciones = new ArrayList<DescripcionDeLadron>();
		
		for (int i = 0; i < cantidadDeDescripciones; i++) {
			String direccionDeLaDescripcion = ((Element)elementosDescripciones.item(i)).getAttribute("direccion");
			
			Document docDeLaDescripcion = this.cargarDocumentoNormalizado(direccionDeLaDescripcion);
			DescripcionDeLadron descripcion = DescripcionDeLadron.hidratar(docDeLaDescripcion, "");
			
			descripciones.add(descripcion);
		}
	}
	
//-------------------------------------------------------------------------------------
	
	public ArrayList<DescripcionDeLadron> verSospechososQueConcuerdanConLaDescripcion(DescripcionDeLadron descripcionDelSospechoso) {
		ArrayList<DescripcionDeLadron> descripcionesQueConcuerdan = new ArrayList<DescripcionDeLadron>();
		
		int cantidadDePosiblesSospechosos = descripciones.size();
		
		for (int i = 0; i < cantidadDePosiblesSospechosos; i++) {
			DescripcionDeLadron descripcionDeUnLadron = descripciones.get(i);
			
			boolean concuerdanLasDescripciones = descripcionDelSospechoso.concuerdanLasDescripciones(descripcionDeUnLadron);
		
			if (concuerdanLasDescripciones) 
				descripcionesQueConcuerdan.add(descripcionDeUnLadron);
		}
		
		return descripcionesQueConcuerdan;
	}
	
	public int verLaCantidadDeLadrones() {
		return descripciones.size();
	}
	
	public DescripcionDeLadron obtenerLaDescripcionDeUnLadron(int indice) {
		return descripciones.get(indice);
	}
}
